package com.spzx.report.utils.chat;

import com.spzx.report.constant.ChatModelConst;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;

/**
 * Package: com.spzx.report.utils.chat
 *
 * @author xiongkunYang
 * @description:
 * @since 2025/6/11 12:03
 */

public class SpzxAiQuest {

    private final ReportAssistAgent agent;

    public SpzxAiQuest(){
        this(ChatModelConst.QWEN_MODEL_NAME);
    }

    public SpzxAiQuest(String modelName) {
        // 初始化语言模型
        // 初始化组件
        ChatModel chatModel = OpenAiChatModel.builder()
                .apiKey(ChatModelConst.API_KEY)
                .baseUrl(ChatModelConst.BASE_URL)
                .modelName(modelName)
                .build();

        // 初始化 chatAgent 代理
        this.agent = AiServices.builder(ReportAssistAgent.class)
                .chatModel(chatModel)
                .systemMessageProvider((ignored) -> PromptGenerator.readPromptFile())
                .build();
    }

    /**
     * 处理用户提问并返回结构化答案
     * 该方法利用通议千问模型对输入的问题进行处理，并返回一个结构化的答案字符串
     * 主要步骤包括：调用模型提问、提取结果中的JSON数据并返回
     *
     * @param question 用户输入的问题字符串
     * @return 结构化的答案字符串，以JSON格式返回
     */
    public String processQuestion(String question) {
        // 通议千问
        // 1. 发送请求，调用模型进行提问，获取结果
        String answer = agent.chat(question);
        // 2. 获取结果中的json数据并返回
        int jsonStart = answer.lastIndexOf("{");
        int jsonEnd = answer.lastIndexOf("}");
        return answer.substring(jsonStart, jsonEnd + 1);
    }

}